<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rculist_bl.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rculist_bl.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1JDVUxJU1RfQkxfSF8w"><span class="b">_LINUX_RCULIST_BL_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1JDVUxJU1RfQkxfSF8w"><span class="b">_LINUX_RCULIST_BL_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="k"> * RCU-protected bl list version. See include/linux/list_bl.h.</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="k"> */</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">list_bl</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rcupdate</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="9" /><span class="Maybe">       9:</span> 
<a name="10" /><span class="Maybe">      10:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">hlist_bl_set_first_rcu</span><span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_head</span> <span class="f">*</span><span class="b">h</span><span class="f">,</span>
<a name="11" /><span class="Maybe">      11:</span>                     <span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">n</span><span class="f">)</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">{</span>
<a name="13" /><span class="Maybe">      13:</span>     <a href="cpu.c_macros_ref.html#_TElTVF9CTF9CVUdfT05fMA__"><span class="b">LIST_BL_BUG_ON</span></a><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">n</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_TElTVF9CTF9MT0NLTUFTS18w"><span class="b">LIST_BL_LOCKMASK</span></a><span class="f">)</span><span class="f">;</span>
<a name="14" /><span class="Maybe">      14:</span>     <a href="cpu.c_macros_ref.html#_TElTVF9CTF9CVUdfT05fMA__"><span class="b">LIST_BL_BUG_ON</span></a><span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">h</span><span class="f">-&gt;</span><span class="b">first</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_TElTVF9CTF9MT0NLTUFTS18w"><span class="b">LIST_BL_LOCKMASK</span></a><span class="f">)</span> <span class="f">!=</span>
<a name="15" /><span class="Maybe">      15:</span>                             <a href="cpu.c_macros_ref.html#_TElTVF9CTF9MT0NLTUFTS18w"><span class="b">LIST_BL_LOCKMASK</span></a><span class="f">)</span><span class="f">;</span>
<a name="16" /><span class="Maybe">      16:</span>     <a href="cpu.c_macros_ref.html#_cmN1X2Fzc2lnbl9wb2ludGVyXzA_"><span class="b">rcu_assign_pointer</span></a><span class="f">(</span><span class="b">h</span><span class="f">-&gt;</span><span class="b">first</span><span class="f">,</span>
<a name="17" /><span class="Maybe">      17:</span>         <span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="b">n</span> <span class="f">|</span> <a href="cpu.c_macros_ref.html#_TElTVF9CTF9MT0NLTUFTS18w"><span class="b">LIST_BL_LOCKMASK</span></a><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">}</span>
<a name="19" /><span class="Maybe">      19:</span> 
<a name="20" /><span class="Maybe">      20:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">hlist_bl_first_rcu</span><span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_head</span> <span class="f">*</span><span class="b">h</span><span class="f">)</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="f">{</span>
<a name="22" /><span class="Maybe">      22:</span>     <span class="m">return</span> <span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="f">)</span>
<a name="23" /><span class="Maybe">      23:</span>         <span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><a href="cpu.c_macros_ref.html#_cmN1X2RlcmVmZXJlbmNlX2NoZWNrXzA_"><span class="b">rcu_dereference_check</span></a><span class="f">(</span><span class="b">h</span><span class="f">-&gt;</span><span class="b">first</span><span class="f">,</span> <span class="b">hlist_bl_is_locked</span><span class="f">(</span><span class="b">h</span><span class="f">)</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">~</span><a href="cpu.c_macros_ref.html#_TElTVF9CTF9MT0NLTUFTS18w"><span class="b">LIST_BL_LOCKMASK</span></a><span class="f">)</span><span class="f">;</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="f">}</span>
<a name="25" /><span class="Maybe">      25:</span> 
<a name="26" /><span class="Maybe">      26:</span> <span class="k">/**</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> * hlist_bl_del_init_rcu - deletes entry from hash list with re-initialization</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> * @n: the element to delete from the hash list.</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> *</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * Note: hlist_bl_unhashed() on the node returns true after this. It is</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * useful for RCU based read lockfree traversal if the writer side</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * must know if the list entry is still hashed or already unhashed.</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> *</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> * In particular, it means that we can not poison the forward pointers</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> * that may still be used for walking the hash list and we can only</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * zero the pprev pointer so list_unhashed() will return true after</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * this.</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> *</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * The caller must take whatever precautions are necessary (such as</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * holding appropriate locks) to avoid racing with another</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * list-mutation primitive, such as hlist_bl_add_head_rcu() or</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * hlist_bl_del_rcu(), running on this same list.  However, it is</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> * perfectly legal to run concurrently with the _rcu list-traversal</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * primitives, such as hlist_bl_for_each_entry_rcu().</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> */</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">hlist_bl_del_init_rcu</span><span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">n</span><span class="f">)</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="f">{</span>
<a name="48" /><span class="Maybe">      48:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">hlist_bl_unhashed</span><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="49" /><span class="Maybe">      49:</span>         <span class="b">__hlist_bl_del</span><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="50" /><span class="Maybe">      50:</span>         <span class="b">n</span><span class="f">-&gt;</span><span class="b">pprev</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>
<a name="51" /><span class="Maybe">      51:</span>     <span class="f">}</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="f">}</span>
<a name="53" /><span class="Maybe">      53:</span> 
<a name="54" /><span class="Maybe">      54:</span> <span class="k">/**</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="k"> * hlist_bl_del_rcu - deletes entry from hash list without re-initialization</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="k"> * @n: the element to delete from the hash list.</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="k"> *</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="k"> * Note: hlist_bl_unhashed() on entry does not return true after this,</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="k"> * the entry is in an undefined state. It is useful for RCU based</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="k"> * lockfree traversal.</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="k"> *</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="k"> * In particular, it means that we can not poison the forward</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="k"> * pointers that may still be used for walking the hash list.</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="k"> *</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="k"> * The caller must take whatever precautions are necessary</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="k"> * (such as holding appropriate locks) to avoid racing</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="k"> * with another list-mutation primitive, such as hlist_bl_add_head_rcu()</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="k"> * or hlist_bl_del_rcu(), running on this same list.</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="k"> * However, it is perfectly legal to run concurrently with</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="k"> * the _rcu list-traversal primitives, such as</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="k"> * hlist_bl_for_each_entry().</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="k"> */</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">hlist_bl_del_rcu</span><span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">n</span><span class="f">)</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="f">{</span>
<a name="75" /><span class="Maybe">      75:</span>     <span class="b">__hlist_bl_del</span><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span>     <span class="b">n</span><span class="f">-&gt;</span><span class="b">pprev</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TElTVF9QT0lTT04yXzA_"><span class="b">LIST_POISON2</span></a><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">}</span>
<a name="78" /><span class="Maybe">      78:</span> 
<a name="79" /><span class="Maybe">      79:</span> <span class="k">/**</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> * hlist_bl_add_head_rcu</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * @n: the element to add to the hash list.</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> * @h: the list to add to.</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> *</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> * Description:</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="k"> * Adds the specified element to the specified hlist_bl,</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="k"> * while permitting racing traversals.</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="k"> *</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="k"> * The caller must take whatever precautions are necessary</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="k"> * (such as holding appropriate locks) to avoid racing</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="k"> * with another list-mutation primitive, such as hlist_bl_add_head_rcu()</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * or hlist_bl_del_rcu(), running on this same list.</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> * However, it is perfectly legal to run concurrently with</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * the _rcu list-traversal primitives, such as</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> * hlist_bl_for_each_entry_rcu(), used to prevent memory-consistency</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="k"> * problems on Alpha CPUs.  Regardless of the type of CPU, the</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="k"> * list-traversal primitive must be guarded by rcu_read_lock().</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="k"> */</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">hlist_bl_add_head_rcu</span><span class="f">(</span><span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">n</span><span class="f">,</span>
<a name="99" /><span class="Maybe">      99:</span>                     <span class="m">struct</span> <span class="b">hlist_bl_head</span> <span class="f">*</span><span class="b">h</span><span class="f">)</span>
<a name="100" /><span class="Maybe">     100:</span> <span class="f">{</span>
<a name="101" /><span class="Maybe">     101:</span>     <span class="m">struct</span> <span class="b">hlist_bl_node</span> <span class="f">*</span><span class="b">first</span><span class="f">;</span>
<a name="102" /><span class="Maybe">     102:</span> 
<a name="103" /><span class="Maybe">     103:</span>     <span class="k">/* don&apos;t need hlist_bl_first_rcu because we&apos;re under lock */</span>
<a name="104" /><span class="Maybe">     104:</span>     <span class="b">first</span> <span class="f">=</span> <span class="b">hlist_bl_first</span><span class="f">(</span><span class="b">h</span><span class="f">)</span><span class="f">;</span>
<a name="105" /><span class="Maybe">     105:</span> 
<a name="106" /><span class="Maybe">     106:</span>     <span class="b">n</span><span class="f">-&gt;</span><span class="b">next</span> <span class="f">=</span> <span class="b">first</span><span class="f">;</span>
<a name="107" /><span class="Maybe">     107:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">first</span><span class="f">)</span>
<a name="108" /><span class="Maybe">     108:</span>         <span class="b">first</span><span class="f">-&gt;</span><span class="b">pprev</span> <span class="f">=</span> <span class="f">&amp;</span><span class="b">n</span><span class="f">-&gt;</span><span class="b">next</span><span class="f">;</span>
<a name="109" /><span class="Maybe">     109:</span>     <span class="b">n</span><span class="f">-&gt;</span><span class="b">pprev</span> <span class="f">=</span> <span class="f">&amp;</span><span class="b">h</span><span class="f">-&gt;</span><span class="b">first</span><span class="f">;</span>
<a name="110" /><span class="Maybe">     110:</span> 
<a name="111" /><span class="Maybe">     111:</span>     <span class="k">/* need _rcu because we can have concurrent lock free readers */</span>
<a name="112" /><span class="Maybe">     112:</span>     <span class="b">hlist_bl_set_first_rcu</span><span class="f">(</span><span class="b">h</span><span class="f">,</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="113" /><span class="Maybe">     113:</span> <span class="f">}</span>
<a name="114" /><span class="Maybe">     114:</span> <span class="k">/**</span>
<a name="115" /><span class="Maybe">     115:</span> <span class="k"> * hlist_bl_for_each_entry_rcu - iterate over rcu list of given type</span>
<a name="116" /><span class="Maybe">     116:</span> <span class="k"> * @tpos:    the type * to use as a loop cursor.</span>
<a name="117" /><span class="Maybe">     117:</span> <span class="k"> * @pos:    the &amp;struct hlist_bl_node to use as a loop cursor.</span>
<a name="118" /><span class="Maybe">     118:</span> <span class="k"> * @head:    the head for your list.</span>
<a name="119" /><span class="Maybe">     119:</span> <span class="k"> * @member:    the name of the hlist_bl_node within the struct.</span>
<a name="120" /><span class="Maybe">     120:</span> <span class="k"> *</span>
<a name="121" /><span class="Maybe">     121:</span> <span class="k"> */</span>
<a name="122" /><span class="Maybe">     122:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aGxpc3RfYmxfZm9yX2VhY2hfZW50cnlfcmN1XzA_"><span class="b">hlist_bl_for_each_entry_rcu</span></a><span class="f">(</span><span class="b">tpos</span><span class="f">,</span> <span class="b">pos</span><span class="f">,</span> <span class="b">head</span><span class="f">,</span> <span class="b">member</span><span class="f">)</span>        \
<a name="123" /><span class="Maybe">     123:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">pos</span> <span class="f">=</span> <span class="b">hlist_bl_first_rcu</span><span class="f">(</span><span class="b">head</span><span class="f">)</span><span class="f">;</span>                \
<a name="124" /><span class="Maybe">     124:</span>         <span class="b">pos</span> <span class="f">&amp;&amp;</span>                            \
<a name="125" /><span class="Maybe">     125:</span>         <span class="f">(</span><span class="f">{</span> <span class="b">tpos</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_aGxpc3RfYmxfZW50cnlfMA__"><span class="b">hlist_bl_entry</span></a><span class="f">(</span><span class="b">pos</span><span class="f">,</span> <span class="b">typeof</span><span class="f">(</span><span class="f">*</span><span class="b">tpos</span><span class="f">)</span><span class="f">,</span> <span class="b">member</span><span class="f">)</span><span class="f">;</span> <span class="c">1</span><span class="f">;</span> <span class="f">}</span><span class="f">)</span><span class="f">;</span> \
<a name="126" /><span class="Maybe">     126:</span>         <span class="b">pos</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_cmN1X2RlcmVmZXJlbmNlX3Jhd18w"><span class="b">rcu_dereference_raw</span></a><span class="f">(</span><span class="b">pos</span><span class="f">-&gt;</span><span class="b">next</span><span class="f">)</span><span class="f">)</span>
<a name="127" /><span class="Maybe">     127:</span> 
<a name="128" /><span class="True">     128:</span> <span class="f">#</span><span class="n">endif</span>
<a name="129" /><span class="True">     129:</span> </pre>
  </body>
</html>
